#pragma once

#include <QObject>
#include <QString>
#include <QTimer>

namespace presentation {

/**
 * @brief ViewModel基类
 * @details 提供通用的ViewModel功能，包括服务注入、生命周期管理、错误处理等
 * 
 * 设计原则：
 * 1. 统一接口：所有ViewModel继承此基类
 * 2. 生命周期管理：与QML组件生命周期同步
 * 3. 错误处理：统一的错误处理机制
 * 4. 服务注入：提供通用的服务注入接口
 */
class BaseViewModel : public QObject {
    Q_OBJECT

    // 通用状态属性
    Q_PROPERTY(bool isInitialized READ isInitialized NOTIFY initializedChanged)
    Q_PROPERTY(bool isLoading READ isLoading NOTIFY loadingChanged)
    Q_PROPERTY(QString lastError READ lastError NOTIFY errorOccurred)

public:
    explicit BaseViewModel(QObject* parent = nullptr);
    virtual ~BaseViewModel() = default;

    // 属性访问器
    bool isInitialized() const { return m_isInitialized; }
    bool isLoading() const { return m_isLoading; }
    QString lastError() const { return m_lastError; }

    /**
     * @brief 初始化ViewModel
     * @details 子类应该重写此方法来实现特定的初始化逻辑
     */
    Q_INVOKABLE virtual void initialize();

    /**
     * @brief 清理ViewModel
     * @details 子类应该重写此方法来实现特定的清理逻辑
     */
    Q_INVOKABLE virtual void cleanup();

    /**
     * @brief 处理错误
     * @param error 错误信息
     */
    virtual void handleError(const QString& error);

    /**
     * @brief 设置加载状态
     * @param loading 是否正在加载
     */
    void setLoading(bool loading);

    /**
     * @brief 重置错误状态
     */
    void clearError();

signals:
    void initializedChanged();
    void loadingChanged();
    void errorOccurred(const QString& error);

protected:
    /**
     * @brief 设置初始化状态
     * @param initialized 是否已初始化
     */
    void setInitialized(bool initialized);

    /**
     * @brief 延迟初始化
     * @param delayMs 延迟时间（毫秒）
     */
    void delayedInitialize(int delayMs = 100);

private slots:
    void onDelayedInitialize();

private:
    bool m_isInitialized{false};
    bool m_isLoading{false};
    QString m_lastError;
    QTimer* m_delayedInitTimer;
};

} // namespace presentation
